/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOVentaFacturacion;
import pe.com.cotelasa.scp.dao.IDAOVentaNotaCredito;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaNotaCredito;

/**
 *
 * @author Jorge
 */
@Service
public class ServicioVentaNotaCreditoImpl implements IServicioVentaNotaCredito, Serializable {

    @Inject
    private IDAOVentaNotaCredito daoVentaNotaCredito;

    @Override
    public ResultadoServicio guardarVentaNotaCredito(VentaNotaCredito ventaNotaCredito) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            ventaNotaCredito.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            resultadoServicio.setID(daoVentaNotaCredito.insert(ventaNotaCredito));
            resultadoServicio.setMensaje("Se guardo el documento satisfactoriamente.");
        } catch (Exception ex) {
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio
                    .setMensaje("Ocurrio un problema al tratar de guardar el documento. Vuelva a intentar");
            Logger.getLogger(ServicioVentaFacturacionImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public ResultadoServicio actualizarVentaNotaCredito(VentaNotaCredito ventaNotaCredito) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {

            daoVentaNotaCredito.actualizar(ventaNotaCredito);
            resultadoServicio.setMensaje("Se guardo el documento satisfactoriamente.");
        } catch (Exception ex) {
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio
                    .setMensaje("Ocurrio un problema al tratar de guardar el documento. Vuelva a intentar");
            Logger.getLogger(ServicioVentaFacturacionImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public List<VentaNotaCredito> obtenerVentaNotaCreditoBusqueda(VentaNotaCredito ventaNotaCredito, Date fechadel, Date fechaal) throws ServiceException {
        try {
            return daoVentaNotaCredito.obtenerVentaNotaCreditoBusqueda(ventaNotaCredito, fechadel, fechaal);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioVentaDepositoImpl.class.getName()).log(Level.SEVERE, null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaNotaCredito> listarTodos() throws ServiceException {
        try {
            return new ArrayList<VentaNotaCredito>(daoVentaNotaCredito.listarTodos(VentaNotaCredito.class));
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public VentaNotaCredito obtenerNotaCreditobyID(Integer ID) throws ServiceException {
        try {
            return daoVentaNotaCredito.obtenerEntidadPorId(VentaNotaCredito.class, ID);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioVentaNotaCreditoImpl.class.getName()).log(Level.SEVERE, null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }


    }

    @Override
    public int obtenerIdMonedaNotaCredito(Integer idVentaNotaCredito) throws ServiceException {
        
        try {
            return daoVentaNotaCredito.obtenerIdMonedaNotaCredito(idVentaNotaCredito);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioVentaNotaCreditoImpl.class.getName()).log(Level.SEVERE, null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public int obtenerIdMotivoNotaCredito(Integer idVentaNotaCredito) throws ServiceException {
        
        try {
            return daoVentaNotaCredito.obtenerIdMotivoNotaCredito(idVentaNotaCredito);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioVentaNotaCreditoImpl.class.getName()).log(Level.SEVERE, null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaNotaCredito> obtenerNotaCreditoRV(String inicio, String fin, Integer idSede) throws ServiceException {
        
        try {
            return daoVentaNotaCredito.obtenerNotaCreditoRV(inicio, fin, idSede);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioVentaNotaCreditoImpl.class.getName()).log(Level.SEVERE, null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
    
    
    @Override
    public boolean esNumeroDocCorrecta(VentaNotaCredito ventaNotaCredito) throws ServiceException{
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("serienc", ventaNotaCredito.getSerienc());
            parametro.put("numnc", ventaNotaCredito.getNumnc());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            
            if(daoVentaNotaCredito.obtenerColeccionEntidadPorFiltros(VentaNotaCredito.class, parametro).size() > 0){
                return true;
            }else{
                return false;
            }
            
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    
    }

    @Override
    public void eliminarDetalleNC(Integer idVentaNotaCredito) throws ServiceException {
        try {
            daoVentaNotaCredito.eliminarDetalleNC(idVentaNotaCredito);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
}
